package io.servicios;

import io.ItemAgenda;
import io.bd.GestorBD;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.Semaphore;

/**
 *
 * @author Mariano Zapata
 */
public class GestorWidgetAgenda extends Thread {
    
    private List<ItemAgenda> proximosEventos;
    private GestorServicios gs;
    private GestorBD gbd;
    private Semaphore semaforo;
    private boolean vida;
    private boolean esperaPorTiempoCumplido;
    
    public GestorWidgetAgenda(GestorServicios gs, GestorBD gbd)
    {
        super("Gestor Widget Agenda");
        proximosEventos= new ArrayList<ItemAgenda>();
        semaforo= new Semaphore(0, true);
        this.gbd= gbd;
        this.gs= gs;
        vida= true;
        esperaPorTiempoCumplido= false;
    }
    
    @Override
    @SuppressWarnings("SleepWhileHoldingLock")
    public void run() {
        while (vida)
        {
            try {
                Calendar hoy= Calendar.getInstance();
                String fechaHoy= hoy.get(Calendar.DATE) + "/" + (hoy.get(Calendar.MONTH) + 1) + "/" +
                        hoy.get(Calendar.YEAR);
                String horaActual= hoy.get(Calendar.HOUR_OF_DAY) + ":" + hoy.get(Calendar.MINUTE);
                proximosEventos= gbd.obtenerProximosEventos(fechaHoy, horaActual);
                gs.avisoSetProximosEventos(proximosEventos);
                if (proximosEventos.isEmpty())
                    semaforo.acquire();
                else
                {
                    ItemAgenda i= proximosEventos.get(0);
                    int [] horaPartes= this.transformarHora(i.getHora());
                    long tiempoEspera= this.diferenciaEntreHoras(hoy.get(Calendar.HOUR_OF_DAY), hoy.get(Calendar.MINUTE),
                            horaPartes[0], horaPartes[1]);
                    Thread.sleep(tiempoEspera);
                    gs.avisoTiempoCumplido();
                    esperaPorTiempoCumplido= true;
                    Thread.sleep(50000);
                    esperaPorTiempoCumplido= false;
                }
            } catch (InterruptedException ex) {/*NADA*/}
              catch (SQLException ex) {vida= false;
                                       gs.error(ex.getMessage());}
        }
    }
    
    public void actualizarProximosEventos()
    {
        if (!esperaPorTiempoCumplido)
            this.interrupt();
    }
    
    public List<ItemAgenda> getProximosEventos() {
        return proximosEventos;
    }
    
    public void detener()
    {
        vida= false;
        this.interrupt();
    }
    
    private long diferenciaEntreHoras(int hi, int mi, int hf, int mf)
    {
        long minutosI= (hi * 60) + mi;
        long milisegundosI= (minutosI * 60) * 1000;
        long minutosF= (hf * 60) + mf;
        long milisegundosF= (minutosF * 60) * 1000;
        Calendar cal= Calendar.getInstance();
        int segundosAhora= cal.get(Calendar.SECOND);
        long milisegundosAhora= segundosAhora * 1000;
        return (milisegundosF - milisegundosI) - milisegundosAhora;
    }
    
    private int [] transformarHora(String h)
    {
        String [] partes= h.split(":");
        int [] ret= new int[2];
        ret[0]= Integer.valueOf(partes[0]);
        ret[1]= Integer.valueOf(partes[1]);
        return ret;
    }
}
